<?php

vendor('abstract_object');
vendor('str');
vendor('ar');

class encoding extends AbstractObject
{
    /**
     * Каноническое имя кодировки.
     *
     * @var string
     */
    protected $_name;

    /**
     * Являются ли октеты 0x00—0x7F соответствующими символами из ASCII.
     *
     * @var bool
     */
    protected $_isASCII;

    /**
     * Кодирует ли данная кодировка все символы unicode.
     *
     * @var bool
     */
    protected $_isUnicode;

    /**
     * Является ли данна кодировка октетной, т. е. той,
     * которая каждый поддерживаемый символ кодирует одним октетом и представленна
     * упорядоченным набором независимых октетов.
     *
     * @var bool
     */
    protected $_isCharset;

    /**
     * Сколько октетов представляет одно слово кодировки (если переменно — null).
     *
     * @var int
     */
    protected $_octetNum;

    static protected $ascii = array(
        'UTF-8',
        'cp1251',
    );
    static protected $unicode = array(
        'UTF-8',
        'cp1251',
    );
    static protected $charsets = array(
        'cp1251',
    );
    static protected $names = array(
        'UTF-8',
        'cp1251',
    );
    static protected $octetNum = array(
        'UTF-8' => null,
        'cp1251' => 1,
    );

    function isASCII()
    {
        return in_array($this->name, $this->ascii, true);
    }

    function isUnicode()
    {
        return in_array($this->name, $this->unicode, true);
    }

    function __construct($name)
    {
    	if (is_object($name) && is_a($name, __CLASS__)) {
    		$this->__copy($name);
    		return;
    	}

    	parent::__construct();
        $this->__readonly_fields[] = 'name';
        $this->__readonly_fields[] = 'isASCII';
        $this->__readonly_fields[] = 'isUnicode';

        $this->_name = $name;
    }

    protected function __copy($obj)
    {
    	if (!(is_object($obj) && is_a($obj, __CLASS__))) {
    		throw new ArgException();
    	}
    	parent::__copy($obj);
        $this->_name = $obj->_name;
    }
}


/**
 * Создаёт/копирует объект encoding
 *
 * @param string/str $name
 * @return encoding
 */
function &encoding($value, $encoding = null)
{
    $args = func_get_args();
    return ____createO(__FUNCTION__, $args);
}
?>